#include "stm32f10x.h"




void init_i2c(void){


    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    
    GPIO_InitTypeDef gpio;
    gpio.GPIO_Mode = GPIO_Mode_AF_OD;
    gpio.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_7;
    gpio.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&gpio);
    
    I2C_InitTypeDef I2C_InitStruct;
    I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStruct.I2C_ClockSpeed= 50000;
    I2C_InitStruct.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
    I2C_InitStruct.I2C_DutyCycle=I2C_DutyCycle_2;//?
    I2C_InitStruct.I2C_Mode=I2C_Mode_I2C;
    I2C_InitStruct.I2C_OwnAddress1 = 0x3A;
    
    I2C_Init(I2C1,&I2C_InitStruct);
    
    I2C_Cmd(I2C1,ENABLE);
}

void wait_event(uint32_t I2C_EVENT){

    uint16_t count = 10000;
    
    while(ERROR==I2C_CheckEvent(I2C1,I2C_EVENT)){
        count--;
        if(count==0){
            break;
        }
    }
    
}

/**

发送I2C的从机地址到总线上
*/
void send_slave_address(uint8_t slave_addr ){

    I2C_GenerateSTART(I2C1,ENABLE);
    // Ev5
    // 主机发送了一个起始条件之后，
    // 此事件用于等待 I2C 总线空闲之后，方可继续发送通信数据
    wait_event(I2C_EVENT_MASTER_MODE_SELECT);
    
    // 发送从机地址
    I2C_Send7bitAddress(I2C1,slave_addr,I2C_Direction_Transmitter);
    
    // Ev6
    // 等待从机接收到自己的地址后，向主机发送一个 ack
    wait_event(I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);

    
    
}


void send_n_byte(uint8_t slave_addr ,uint8_t * data,uint8_t data_length){

    send_slave_address(slave_addr);
    //I2C_SendData(I2C1,reg_addr );
    // Ev8
    
    //wait_event(I2C_EVENT_MASTER_BYTE_TRANSMITTED);
    
    uint8_t i=0;
    for(;i<data_length;i++){
        // 发送从机寄存器地址
        I2C_SendData(I2C1,data[i]);
        // Ev8_2
        // 等待 数据（这里是从机的寄存器地址）已经被转运到 移位寄存器
        wait_event(I2C_EVENT_MASTER_BYTE_TRANSMITTED);
    }
   
    I2C_GenerateSTOP(I2C1,ENABLE);   
}





